package org.example.extend.cmp2;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;

/**
 * beanFactory 加载了 beanDefinition，但是还没实例化bean示例
 * 这个时候:
 * 1. 可以定义自己的 beanDefinition
 * 2. 可以修改 beanFactory 中原有的beanDefinition
 * 3. !!!注意，不要在这里实例化bean，这里只做 beanDefinition 定义处理!!!
 * <p>
 * 具体spring是什么时候执行这个扩展点的呢？
 * 1. 如何收集并实例化这些实现了 BeanFactoryPostProcessor 的类呢？
 * 2. 执行位置（加载完默认规则的bd后） AbstractApplicationContext#invokeBeanFactoryPostProcessors()
 *
 * @author xiajiqiu
 * @since 2024/6/8 12:07
 */
@Slf4j
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        if (beanFactory instanceof BeanDefinitionRegistry) {
            BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
            log.info("ready register or modify beanDefinition, the registry is {}", registry);
        } else {
            log.warn("unsupported register beanDefinition, not BeanDefinitionRegistry beanFactory");
        }
    }
}
